package com.camic.server.tool
{	
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLRequestMethod;

	/**
	 * 本方法，主要用户获取IP地址对应的城市名
	 * @author Norris
	 * 
	 */	
	public class GetIPCityName
	{
		/** 成功的回调函数 **/
		private var m_fnSuccess:Function = null;
		/** 失败的回调函数 **/
		private var m_fnError:Function = null;
		/** 加载器 **/
		private var loader:URLLoader = null;
		/** 获取城市名的Web服务网址 **/
		private const cityUrl:String = "http://www.webxml.com.cn/WebServices/IpAddressSearchWebService.asmx/getGeoIPContext";
		/** GetIPCityName类的唯一实例 **/
		static private var m_instance:GetIPCityName = null;
		
		/**
		 * 获取GetIPCityName类的唯一实例
		 * @return GetIPCityName
		 */		
		static public function getInstance():GetIPCityName{
			if( m_instance == null ){
				m_instance = new GetIPCityName();
			}
			return m_instance;
		}
		
		public function GetIPCityName()
		{
		}
		
		/**
		 * 获取当前网络的IP地址和相对应的城市名称 
		 */		
		public function _get(__fnSuccess:Function , __fnError:Function = null):void{
			m_fnSuccess = __fnSuccess;
			m_fnError = __fnError;
			loader = new URLLoader();
			addEvent();
			var request:URLRequest=new URLRequest(cityUrl);
			request.method=URLRequestMethod.POST;
			request.data="";
			loader.load(request);
		}
		
		/**
		 * 添加监听事件 
		 */		
		private function addEvent():void{
			loader.addEventListener(Event.COMPLETE, parseResult);
			loader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
		}
		
		/**
		 * 移除监听事件 
		 */		
		private function removeEvent():void{
			loader.removeEventListener(Event.COMPLETE, parseResult);
			loader.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
		}
		
		/**
		 * 获取IP地址成功，对地址进行解释并发送相对应的事件通知 
		 * @param evt
		 */		
		private function parseResult(evt:Event):void{
			removeEvent();
			trace("--------------------------类：GetIPCityName，加载XML文件成功了--------------------------")
			var myCityXMl:XML=new XML(evt.target.data);
			var resultcName:String=myCityXMl.children()[1].toString();
			var beginIndex:int = resultcName.indexOf("省");
			if(beginIndex == -1)
				beginIndex = resultcName.indexOf("自治区");
			if(beginIndex == -1){
				trace("暂不提供该地区的天气预报服务");
				m_fnError(); // 发送自定义事件
			} else {
				var endIndex:int = resultcName.indexOf("市");
				var cityName:String = resultcName.substring(beginIndex + 1, endIndex);
				trace("城市名：" + cityName);
				m_fnSuccess(cityName);
			}
			destroy();
		}
		
		/**
		 * 加载XML文件出错的处理方法 
		 * @param e
		 */		
		private function errorHandler(e:IOErrorEvent):void{
			removeEvent();
			destroy();
			m_fnError();  // 发送自定义事件
			trace("--------------------------类：GetIPCityName，加载XML文件时出问题了--------------------------");
		}
		
		/**
		 * 销毁资源 
		 */		
		private function destroy():void{
			loader = null;
		}
	}
}